gdk,xi2: Ensure scroll valuators are reset on window/device switch
authorCarlos Garnacho <carlosg@gnome.org>
Thu, 23 Feb 2012 17:24:37 +0000 (18:24 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 1 Mar 2012 21:29:01 +0000 (16:29 -0500)
This is in order to avoid scrolling glitches as the device causing
scrolling to happen or the Window receiving the events changes.

gdk/x11/gdkdevicemanager-xi2.c

index 2fb66e120b4d2a84257f77ba6371f63c2bd64507..955b8fc128208f36e76b31510e59059939aec612 100644 (file)
@@ -757,11 +757,13 @@ handle_device_changed (GdkX11DeviceManagerXI2 *device_manager,
                        XIDeviceChangedEvent   *ev)
 {
   GdkDisplay *display;
-  GdkDevice *device;
+  GdkDevice *device, *source_device;
 
   display = gdk_device_manager_get_display (GDK_DEVICE_MANAGER (device_manager));
   device = g_hash_table_lookup (device_manager->id_table,
                                 GUINT_TO_POINTER (ev->deviceid));
+  source_device = g_hash_table_lookup (device_manager->id_table,
+                                       GUINT_TO_POINTER (ev->sourceid));
 
   if (device)
     {
@@ -770,6 +772,9 @@ handle_device_changed (GdkX11DeviceManagerXI2 *device_manager,
 
       g_signal_emit_by_name (G_OBJECT (device), "changed");
     }
+
+  if (source_device)
+    _gdk_device_xi2_reset_scroll_valuators (GDK_X11_DEVICE_XI2 (source_device));
 }
 
 static GdkCrossingMode
@@ -1522,6 +1527,7 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
         source_device = g_hash_table_lookup (device_manager->id_table,
                                              GUINT_TO_POINTER (xev->sourceid));
         gdk_event_set_source_device (event, source_device);
+        _gdk_device_xi2_reset_scroll_valuators (GDK_X11_DEVICE_XI2 (source_device));
 
         event->crossing.mode = translate_crossing_mode (xev->mode);
         event->crossing.detail = translate_notify_type (xev->detail);